home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic 4 Database How-To / Visual Basic 4 Database - How-to (The Waite Group)(1995).iso / isam2.fr_ / isam2.fr
Text File  |  1995-07-05  |  24KB  |  771 lines

  1. VERSION 4.00
  2. Begin VB.Form frmCustomers 
  3.    BackColor       =   &H00C0C0C0&
  4.    Caption         =   "Customers"
  5.    ClientHeight    =   3870
  6.    ClientLeft      =   2100
  7.    ClientTop       =   3060
  8.    ClientWidth     =   8205
  9.    BeginProperty Font 
  10.       name            =   "MS Sans Serif"
  11.       charset         =   0
  12.       weight          =   700
  13.       size            =   8.25
  14.       underline       =   0   'False
  15.       italic          =   0   'False
  16.       strikethrough   =   0   'False
  17.    EndProperty
  18.    Height          =   4275
  19.    Left            =   2040
  20.    LinkTopic       =   "Form1"
  21.    ScaleHeight     =   3870
  22.    ScaleWidth      =   8205
  23.    Top             =   2715
  24.    Width           =   8325
  25.    Begin VB.CommandButton cmdMove 
  26.       Caption         =   ">>"
  27.       BeginProperty Font 
  28.          name            =   "MS Sans Serif"
  29.          charset         =   0
  30.          weight          =   700
  31.          size            =   9.75
  32.          underline       =   0   'False
  33.          italic          =   0   'False
  34.          strikethrough   =   0   'False
  35.       EndProperty
  36.       Height          =   315
  37.       Index           =   3
  38.       Left            =   2100
  39.       TabIndex        =   26
  40.       Top             =   3240
  41.       Width           =   495
  42.    End
  43.    Begin VB.CommandButton cmdMove 
  44.       Caption         =   ">"
  45.       BeginProperty Font 
  46.          name            =   "MS Sans Serif"
  47.          charset         =   0
  48.          weight          =   700
  49.          size            =   9.75
  50.          underline       =   0   'False
  51.          italic          =   0   'False
  52.          strikethrough   =   0   'False
  53.       EndProperty
  54.       Height          =   315
  55.       Index           =   2
  56.       Left            =   1620
  57.       TabIndex        =   25
  58.       Top             =   3240
  59.       Width           =   495
  60.    End
  61.    Begin VB.CommandButton cmdMove 
  62.       Caption         =   "<"
  63.       BeginProperty Font 
  64.          name            =   "MS Sans Serif"
  65.          charset         =   0
  66.          weight          =   700
  67.          size            =   9.75
  68.          underline       =   0   'False
  69.          italic          =   0   'False
  70.          strikethrough   =   0   'False
  71.       EndProperty
  72.       Height          =   315
  73.       Index           =   1
  74.       Left            =   1140
  75.       TabIndex        =   24
  76.       Top             =   3240
  77.       Width           =   495
  78.    End
  79.    Begin VB.CommandButton cmdMove 
  80.       Caption         =   "<<"
  81.       BeginProperty Font 
  82.          name            =   "MS Sans Serif"
  83.          charset         =   0
  84.          weight          =   700
  85.          size            =   9.75
  86.          underline       =   0   'False
  87.          italic          =   0   'False
  88.          strikethrough   =   0   'False
  89.       EndProperty
  90.       Height          =   315
  91.       Index           =   0
  92.       Left            =   660
  93.       TabIndex        =   23
  94.       Top             =   3240
  95.       Width           =   495
  96.    End
  97.    Begin VB.CommandButton cmdDelete 
  98.       Caption         =   "&Delete"
  99.       Height          =   315
  100.       Left            =   5160
  101.       TabIndex        =   22
  102.       Top             =   3240
  103.       Width           =   1155
  104.    End
  105.    Begin VB.CommandButton cmdClose 
  106.       Caption         =   "Cl&ose"
  107.       Height          =   315
  108.       Left            =   6660
  109.       TabIndex        =   21
  110.       Top             =   3240
  111.       Width           =   1155
  112.    End
  113.    Begin VB.TextBox txtData 
  114.       Alignment       =   2  'Center
  115.       DataField       =   "STATE"
  116.       DataSource      =   "Data1"
  117.       Height          =   315
  118.       Index           =   6
  119.       Left            =   4800
  120.       MaxLength       =   2
  121.       TabIndex        =   13
  122.       Top             =   2100
  123.       Width           =   405
  124.    End
  125.    Begin VB.TextBox txtData 
  126.       DataField       =   "ZIPCODE"
  127.       DataSource      =   "Data1"
  128.       Height          =   315
  129.       Index           =   7
  130.       Left            =   6360
  131.       MaxLength       =   10
  132.       TabIndex        =   15
  133.       Top             =   2100
  134.       Width           =   1215
  135.    End
  136.    Begin VB.TextBox txtData 
  137.       DataField       =   "PHONE"
  138.       DataSource      =   "Data1"
  139.       Height          =   315
  140.       Index           =   8
  141.       Left            =   1380
  142.       MaxLength       =   14
  143.       TabIndex        =   17
  144.       Top             =   2580
  145.       Width           =   1875
  146.    End
  147.    Begin VB.TextBox txtData 
  148.       DataField       =   "FAX"
  149.       DataSource      =   "Data1"
  150.       Height          =   315
  151.       Index           =   9
  152.       Left            =   3900
  153.       MaxLength       =   14
  154.       TabIndex        =   19
  155.       Top             =   2580
  156.       Width           =   1875
  157.    End
  158.    Begin VB.CommandButton cmdAdd 
  159.       Caption         =   "&Add"
  160.       Height          =   315
  161.       Left            =   3600
  162.       TabIndex        =   20
  163.       Top             =   3240
  164.       Width           =   1215
  165.    End
  166.    Begin VB.TextBox txtData 
  167.       DataField       =   "CITY"
  168.       DataSource      =   "Data1"
  169.       Height          =   315
  170.       Index           =   5
  171.       Left            =   1380
  172.       MaxLength       =   20
  173.       TabIndex        =   11
  174.       Top             =   2100
  175.       Width           =   2595
  176.    End
  177.    Begin VB.TextBox txtData 
  178.       DataField       =   "ADDRESS2"
  179.       DataSource      =   "Data1"
  180.       Height          =   315
  181.       Index           =   4
  182.       Left            =   1380
  183.       MaxLength       =   20
  184.       TabIndex        =   9
  185.       Top             =   1620
  186.       Width           =   4215
  187.    End
  188.    Begin VB.TextBox txtData 
  189.       DataField       =   "ADDRESS1"
  190.       DataSource      =   "Data1"
  191.       Height          =   315
  192.       Index           =   3
  193.       Left            =   1380
  194.       MaxLength       =   40
  195.       TabIndex        =   7
  196.       Top             =   1140
  197.       Width           =   4215
  198.    End
  199.    Begin VB.TextBox txtData 
  200.       DataField       =   "CUSTNUM"
  201.       DataSource      =   "Data1"
  202.       Height          =   285
  203.       Index           =   0
  204.       Left            =   1965
  205.       MaxLength       =   5
  206.       TabIndex        =   1
  207.       Top             =   210
  208.       Width           =   750
  209.    End
  210.    Begin VB.TextBox txtData 
  211.       DataField       =   "FIRSTNAME"
  212.       DataSource      =   "Data1"
  213.       Height          =   315
  214.       Index           =   2
  215.       Left            =   5280
  216.       MaxLength       =   20
  217.       TabIndex        =   5
  218.       Top             =   660
  219.       Width           =   2595
  220.    End
  221.    Begin VB.TextBox txtData 
  222.       DataField       =   "LASTNAME"
  223.       DataSource      =   "Data1"
  224.       Height          =   315
  225.       Index           =   1
  226.       Left            =   1380
  227.       MaxLength       =   20
  228.       TabIndex        =   3
  229.       Top             =   660
  230.       Width           =   2595
  231.    End
  232.    Begin VB.Label lblFax 
  233.       AutoSize        =   -1  'True
  234.       BackColor       =   &H00C0C0C0&
  235.       Caption         =   "Fa&x:"
  236.       Height          =   195
  237.       Left            =   3420
  238.       TabIndex        =   18
  239.       Top             =   2640
  240.       Width           =   375
  241.    End
  242.    Begin VB.Label lblPhone 
  243.       AutoSize        =   -1  'True
  244.       BackColor       =   &H00C0C0C0&
  245.       Caption         =   "&Phone:"
  246.       Height          =   195
  247.       Left            =   660
  248.       TabIndex        =   16
  249.       Top             =   2640
  250.       Width           =   615
  251.    End
  252.    Begin VB.Label Label3 
  253.       AutoSize        =   -1  'True
  254.       BackColor       =   &H00C0C0C0&
  255.       Caption         =   "&Zip Code:"
  256.       Height          =   195
  257.       Left            =   5415
  258.       TabIndex        =   14
  259.       Top             =   2160
  260.       Width           =   840
  261.    End
  262.    Begin VB.Label Label2 
  263.       AutoSize        =   -1  'True
  264.       BackColor       =   &H00C0C0C0&
  265.       Caption         =   "S&tate:"
  266.       Height          =   195
  267.       Left            =   4170
  268.       TabIndex        =   12
  269.       Top             =   2160
  270.       Width           =   525
  271.    End
  272.    Begin VB.Label Label1 
  273.       AutoSize        =   -1  'True
  274.       BackColor       =   &H00C0C0C0&
  275.       Caption         =   "&City:"
  276.       Height          =   195
  277.       Left            =   885
  278.       TabIndex        =   10
  279.       Top             =   2160
  280.       Width           =   390
  281.    End
  282.    Begin VB.Label lblAddress2 
  283.       AutoSize        =   -1  'True
  284.       BackColor       =   &H00C0C0C0&
  285.       Caption         =   "Addr&ess 2:"
  286.       Height          =   195
  287.       Left            =   360
  288.       TabIndex        =   8
  289.       Top             =   1680
  290.       Width           =   915
  291.    End
  292.    Begin VB.Label lblAddress1 
  293.       AutoSize        =   -1  'True
  294.       BackColor       =   &H00C0C0C0&
  295.       Caption         =   "Addre&ss 1:"
  296.       Height          =   195
  297.       Left            =   360
  298.       TabIndex        =   6
  299.       Top             =   1200
  300.       Width           =   915
  301.    End
  302.    Begin VB.Label lblCustomerNumber 
  303.       AutoSize        =   -1  'True
  304.       BackColor       =   &H00C0C0C0&
  305.       Caption         =   "Customer &Number:"
  306.       Height          =   195
  307.       Left            =   300
  308.       TabIndex        =   0
  309.       Top             =   240
  310.       Width           =   1560
  311.    End
  312.    Begin VB.Label lblFirst 
  313.       AutoSize        =   -1  'True
  314.       BackColor       =   &H00C0C0C0&
  315.       Caption         =   "&First Name:"
  316.       Height          =   195
  317.       Left            =   4200
  318.       TabIndex        =   4
  319.       Top             =   720
  320.       Width           =   975
  321.    End
  322.    Begin VB.Label lblLast 
  323.       AutoSize        =   -1  'True
  324.       BackColor       =   &H00C0C0C0&
  325.       Caption         =   "&Last Name:"
  326.       Height          =   195
  327.       Left            =   300
  328.       TabIndex        =   2
  329.       Top             =   720
  330.       Width           =   975
  331.    End
  332. End
  333. Attribute VB_Name = "frmCustomers"
  334. Attribute VB_Creatable = False
  335. Attribute VB_Exposed = False
  336. Option Explicit
  337.  
  338. ' DataChanged is used to keep track of whether a form needs to be saved.
  339. ' It is set at false by the first call to DisplayRecord. All text box Change
  340. ' events set it true. When a record is saved or a new record is displayed,
  341. ' it is reset back to false.
  342.  
  343. Private DataChanged As Boolean
  344.  
  345. ' db is the database variable, declared at form level. It is Set to
  346. ' the correct directory in the Form Load event.
  347.  
  348. Private db As DATABASE
  349.  
  350. ' rs is the customer recordset. It is Set to the CUSTOMER.DBF
  351. ' table in the Form_Load event.
  352.  
  353. Private rs As Recordset
  354.  
  355. ' We use a control array for the text boxes. The following constants are
  356. ' used to make the array index numbers meaningful.
  357.  
  358. Private Const CUSTNUM = 0
  359. Private Const LASTNAME = 1
  360. Private Const FIRSTNAME = 2
  361. Private Const ADDRESS1 = 3
  362. Private Const ADDRESS2 = 4
  363. Private Const CITY = 5
  364. Private Const STATE = 6
  365. Private Const ZIPCODE = 7
  366. Private Const PHONE = 8
  367. Private Const FAX = 9
  368.  
  369.  
  370. Private Sub Form_Load()
  371.     Dim dbName As String
  372.     
  373.     ' Set the two data access object variables that were declared at
  374.     ' module level.
  375.  
  376.     ' Get the database name and open the database.
  377.     dbName = DataPath() & "\CHAPTER.05" ' DataPath() is in READINI.BAS
  378.     Set db = DBEngine.Workspaces(0).OpenDatabase _
  379.      (dbName, False, False, "dBase IV")
  380.  
  381.     Set rs = db.OpenRecordset("CUSTOMER", dbOpenTable)
  382.  
  383. End Sub
  384.  
  385. Private Sub Form_Activate()
  386.  
  387.     ' If there are no records in the table, then both beginning-of-file (BOF)
  388.     ' and end-of-file (EOF) are True. If this is true, call EmptyRecordset,
  389.     ' which gives the user a choice between adding a new blank record and
  390.     ' terminating the program.
  391.  
  392.     If rs.BOF And rs.EOF Then EmptyRecordset
  393.  
  394.     ' Display the first record in the table recordset.
  395.  
  396.     DisplayRecord
  397.     
  398. End Sub
  399.  
  400. Private Sub cmdAdd_Click()
  401.  
  402.     ' The user clicked the Add button.
  403.     
  404.     With rs
  405.  
  406.         ' Prepare to add a new blank record.
  407.  
  408.         .AddNew
  409.     
  410.         ' Now actually add the record.
  411.     
  412.          .UPDATE
  413.  
  414.         ' Move to the new record
  415.     
  416.        .MoveLast
  417.  
  418.     End With
  419.     
  420.     ' Display the new record for user entry.
  421.     
  422.     DisplayRecord
  423.  
  424. End Sub
  425.  
  426. Private Sub cmdDelete_Click()
  427.  
  428.     ' Get confirmation that the user wants to delete the current record.
  429.  
  430.    If MsgBox("Do you want to delete " & MakeName(CStr(txtData(LASTNAME)), _
  431.    CStr(txtData(FIRSTNAME))) & "?", vbQuestion + vbYesNo + vbDefaultButton2) _
  432.     = vbYes Then
  433.  
  434.         ' Delete the record
  435.         ' To remove the record from the active set, the line "Deleted=On"
  436.         ' must appear in the [dBase ISAM] section of VB.INI or the
  437.         ' application's INI file. See How-To 4.1 for details.
  438.  
  439.         ' If the user deleted the only record in the database, call the
  440.         ' EmptyRecordset procedure to give the user a chance to add a new
  441.         ' blank record. If the user chooses not to add a new record,
  442.         ' EmptyRecordset terminates the program.
  443.  
  444.         rs.DELETE
  445.  
  446.         ' If the user deleted the only record in the database, call the
  447.         ' EmptyRecordset procedure to give the user a chance to add a new
  448.         ' blank record. If the user chooses not to add a new record,
  449.         ' EmptyRecordset terminates the program.
  450.  
  451.         If rs.BOF And rs.EOF Then
  452.             EmptyRecordset
  453.  
  454.         Else
  455.  
  456.             ' After a delete, the recordset has no current record. So move
  457.             ' to the next record in the recordset.
  458.  
  459.             rs.MoveNext
  460.  
  461.             ' If the user deleted the record that was positioned
  462.             ' at the end of the database, move to the previous record. Since
  463.             ' we checked earlier for an empty database, we know there must
  464.             ' a previous record.
  465.  
  466.             If rs.EOF Then rs.MovePrevious
  467.  
  468.             ' Display the new current record.
  469.  
  470.             DisplayRecord
  471.  
  472.         End If
  473.  
  474.     End If
  475.  
  476. End Sub
  477.  
  478. Private Sub cmdClose_Click()
  479.  
  480.     Unload frmCustomers
  481.     
  482. End Sub
  483. Private Sub cmdMove_Click(Index As Integer)
  484.     
  485.     ' The user clicked one of the navigation buttons - First, Prev, Next, or
  486.     ' Last. Since these buttons are a control array, the specific button
  487.     ' clicked is passed in the Index argument.
  488.     
  489.     Dim performMove As Integer
  490.     Const MOVE_FIRST = 0
  491.     Const MOVE_PREVIOUS = 1
  492.     Const MOVE_NEXT = 2
  493.     Const MOVE_LAST = 3
  494.     
  495.     ' Set the performMove flag to its default value
  496.     
  497.     performMove = True
  498.     
  499.     ' If the data have changed since the last time the record was saved, save
  500.     ' the record. If the save is successful, performMove will remain True;
  501.     ' otherwise, it will be set to False.
  502.     
  503.     If DataChanged Then performMove = SaveRecord()
  504.     
  505.     ' If the data have not changed or the save operation was successful, then
  506.     ' change to the specified record.
  507.     
  508.     If performMove = True Then
  509.         Select Case Index
  510.             Case MOVE_NEXT
  511.                 
  512.                 ' Check to make sure the record pointer's not at EOF. Without
  513.                 ' this, an error would occur if the pointer was at EOF.
  514.                 
  515.                 If Not rs.EOF Then
  516.                     
  517.                     ' Okay to move to the next record.
  518.                     
  519.                     rs.MoveNext
  520.                     
  521.                     ' Now did the move put the pointer at EOF? If so, there's
  522.                     ' no current record, and several other routines assume
  523.                     ' there's always a current record. So if the pointer's at
  524.                     ' EOF, move it back to where it was.
  525.                     
  526.                     If rs.EOF Then rs.MovePrevious
  527.                 End If
  528.             Case MOVE_PREVIOUS
  529.                 
  530.                 ' Check to make sure the record pointer's not at BOF. Without
  531.                 ' this, an error would occur if the pointer was at BOF.
  532.                 
  533.                 If Not rs.BOF Then
  534.                     
  535.                     ' Okay to move to the previous record.
  536.                     
  537.                     rs.MovePrevious
  538.                     
  539.                     ' Now did the move put the pointer at BOF? If so, there's
  540.                     ' no current record, and several other routines assume
  541.                     ' there's always a current record. So if the pointer's at
  542.                     ' BOF, move it back to where it was.
  543.                     
  544.                     If rs.BOF Then rs.MoveNext
  545.                 End If
  546.             Case MOVE_LAST
  547.                 
  548.                 ' Move the record pointer to the last record in the file.
  549.                 
  550.                 rs.MoveLast
  551.             Case MOVE_FIRST
  552.                 
  553.                 ' Move the record pointer to the first record in the file.
  554.                 
  555.                 rs.MoveFirst
  556.         End Select
  557.         
  558.         ' Show the record the record pointer's currently pointing at.
  559.         
  560.         DisplayRecord
  561.     End If
  562. End Sub
  563.  
  564. Sub EmptyRecordset()
  565.  
  566.     ' Gives the user a chance to add a record to the data base. If the user
  567.     ' elects not to add a record, the program terminates.
  568.  
  569.     Dim msg1 As String, msg2 As String, msg3 As String
  570.        
  571.     msg1 = "There are no customer records in the data base. "
  572.     msg2 = "Do you want to add a new blank record? "
  573.     msg3 = "(If you answer no, the program will terminate.)"
  574.     If MsgBox(msg1 & msg2 & msg3, vbQuestion + vbYesNo) = vbYes Then
  575.         cmdAdd_Click
  576.     Else
  577.         End
  578.     End If
  579.  
  580. End Sub
  581.  
  582. Private Function MakeName(LASTNAME As String, FIRSTNAME As String) As String
  583.  
  584.     ' Returns a name of the form First Last, compensating for the
  585.     ' possibility that either first or last name may be a zero-length string.
  586.  
  587.     Dim nm As String
  588.     
  589.     nm = FIRSTNAME & IIf(FIRSTNAME <> "", " ", "") & LASTNAME
  590.     MakeName = IIf(nm = "", "the current record", nm)
  591.     
  592. End Function
  593.  
  594.  
  595. Private Sub DisplayField(txt As TextBox, fieldName As String)
  596.  
  597.     ' If fieldName is not null, displays the contents of the field in the
  598.     ' text box. If the field is null, displays an empty string.
  599.  
  600.     txt = IIf(Not IsNull(rs(fieldName)), rs(fieldName), "")
  601.  
  602. End Sub
  603.  
  604. Private Sub DisplayRecord()
  605.  
  606.     ' displays the current record
  607.  
  608.     DisplayField txtData(CUSTNUM), "CUSTNUM"
  609.     DisplayField txtData(LASTNAME), "LASTNAME"
  610.     DisplayField txtData(FIRSTNAME), "FIRSTNAME"
  611.     DisplayField txtData(ADDRESS1), "ADDRESS1"
  612.     DisplayField txtData(ADDRESS2), "ADDRESS2"
  613.     DisplayField txtData(CITY), "CITY"
  614.     DisplayField txtData(STATE), "STATE"
  615.     DisplayField txtData(ZIPCODE), "ZIPCODE"
  616.     DisplayField txtData(PHONE), "PHONE"
  617.     DisplayField txtData(FAX), "FAX"
  618.     
  619.     txtData(CUSTNUM).SetFocus
  620.     
  621.     ' DataChanged is set to true by the Change event of every text box
  622.     ' which fires in every DisplayField routine. Set it false now because
  623.     ' the data have not changed since the last save.
  624.     
  625.     DataChanged = False
  626. End Sub
  627.  
  628. Private Function SaveRecord()
  629.  
  630.     ' This procedure saves the current record to he data base file. If it is
  631.     ' successful, it returns True. If an error occurs, it returns False.
  632.  
  633.     On Error GoTo SaveRecordError
  634.  
  635.     With rs
  636.  
  637.         ' Move the record into the edit buffer.
  638.  
  639.         .Edit
  640.  
  641.         ' Now set the data fields from the text boxes on the form.
  642.  
  643.         !CUSTNUM = txtData(CUSTNUM)
  644.         !LASTNAME = txtData(LASTNAME)
  645.         !FIRSTNAME = txtData(FIRSTNAME)
  646.         !ADDRESS1 = txtData(ADDRESS1)
  647.         !ADDRESS2 = txtData(ADDRESS2)
  648.         !CITY = txtData(CITY)
  649.         !STATE = UCase$(txtData(STATE))
  650.         !ZIPCODE = txtData(ZIPCODE)
  651.         !PHONE = txtData(PHONE)
  652.         !FAX = txtData(FAX)
  653.  
  654.         ' Now update the data base. If you forget this step you'll accomplish
  655.         ' nothing - and no error message to warn you! If an error occurs
  656.         ' before this step is reached, the data will not be saved, since the
  657.         ' error-handling routine exits from the function.
  658.  
  659.          .UPDATE
  660.  
  661.     End With
  662.  
  663.     ' Set the module-level variable DataChanged to false.
  664.  
  665.     DataChanged = False
  666.  
  667.     ' Return True to indicated that the data were saved successfully.
  668.  
  669.     SaveRecord = True
  670.  
  671. Exit Function
  672.  
  673. SaveRecordError:
  674.  
  675.     ' If an error code 13 (Type Mismatch) caused the error, the error must be
  676.     ' in the Customer Number field which requires a numeric value (all the
  677.     ' other text boxes are saved to text fields and they will take anything),
  678.     ' so display a meaningful error message.
  679.  
  680.     If Err = 13 Then
  681.         MsgBox "The Customer Number field must contain a numeric value.", _
  682.         vbExclamation
  683.         txtData(CUSTNUM).SetFocus
  684.     Else
  685.  
  686.         ' Not error 13, so just pass through Visual Basic's error message.
  687.  
  688.         MsgBox Error(Err)
  689.     End If
  690.  
  691.     ' Return False to indicated that the data were not saved successfully.
  692.  
  693.     SaveRecord = False
  694.  
  695. Exit Function
  696.  
  697. End Function
  698.  
  699. Private Sub txtData_Change(Index As Integer)
  700.     DataChanged = True
  701. End Sub
  702.  
  703. Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  704.  
  705.     ' This event is evoked automatically before the program is unloaded.
  706.     ' If the UnloadMode argument indicates that the cause of the unload
  707.     ' request is from the Windows Task Manager's End Task command or from a
  708.     ' command to exit from Windows, then the procedure calls ExitProgram().
  709.     ' If the current record need not be saved or if the current record is
  710.     ' saved without error, ExitProgram() simply Ends; otherwise, it returns
  711.     ' False. The False is converted to a True, which is returned to the
  712.     ' calling program by assigning it to the Cancel argument. Since setting
  713.     ' Cancel to any non-zero value cancels the event, this prevents the
  714.     ' program from being terminated.
  715.  
  716.     ' If the cause of the Unload query is the user choosing Close or closing
  717.     ' through the Control menu, ExitProgram() is called from the Form_Unload
  718.     ' or procedure, so there's no need to duplicate the call here.
  719.  
  720.     Const TASKMANAGER = 2
  721.     Const EXITWINDOWS = 3
  722.  
  723.     If UnloadMode = TASKMANAGER Or UnloadMode = EXITWINDOWS Then
  724.         Cancel = Not ExitProgram()
  725.     End If
  726. End Sub
  727.  
  728. Private Sub Form_Unload(Cancel As Integer)
  729.     
  730.     ' Calls the ExitProgram routine, which saves the current record if it's
  731.     ' been changed, then executes an End statement.
  732.     
  733.     If ExitProgram() = False Then Cancel = True
  734. End Sub
  735.  
  736. Private Sub mnuFileExit_Click()
  737.  
  738.     ' The user clicked Exit on the File menu or pressed Ctrl-Q.
  739.  
  740.     ' Calls the ExitProgram routine which saves the current record if it's
  741.     ' been changed, then executes an End statement. If the save fails,
  742.     ' ExitProgram does not execute the End, but instead returns a False.
  743.     ' This procedure just ignores the return value and does nothing if
  744.     ' the program cannot exit.
  745.  
  746.     ExitProgram
  747.  
  748. End Sub
  749.  
  750. Private Function ExitProgram() As Boolean
  751.     
  752.     ' This routine is called from the mnuFileExit_Click event and from the
  753.     ' Form_Unload event. This gives the application consistent behavior no
  754.     ' matter how the user exits from the program. If the current record does
  755.     ' not need saving or if it's saved successfully, the function Ends the
  756.     ' program. If the current record is not saved successfully, the function
  757.     ' returns a False.
  758.     
  759.     If DataChanged Then
  760.         If SaveRecord() = True Then
  761.             End
  762.         Else
  763.             ExitProgram = False
  764.         End If
  765.     Else
  766.         End
  767.     End If
  768. End Function
  769.  
  770.  
  771.